#include "weather_online.h"
#include "ui_weather_online.h"

#include <QFile>
#include <QMessageBox>

weather_online::weather_online(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::weather_online)
{
    ui->setupUi(this);
    this->setWindowTitle("天气预报");

        read_file();
        this->online = new QNetworkAccessManager(this);

        connect(ui->btn_query,&QPushButton::clicked,this,&weather_online::send_requests);//点击查询发送请求
        connect(this->online,&QNetworkAccessManager::finished,this,&weather_online::handle_msg);//请求完成后处理得到的数据信息
//        connect(ui->btn_query,&QPushButton::clicked,this,&weather_online::show_current);
        connect(ui->weather_info,&QListWidget::itemClicked,this,&weather_online::show_current);//显示当前选中项天气信息

}

weather_online::~weather_online()
{
    delete ui;
}
//读取文件城市与对应ID
void weather_online::read_file()
{
    QFile file(":/txt/city.txt");
    //资源的文本文件 只能以只读方式打开
    if(!file.open(QIODevice::ReadOnly))
    {
       QMessageBox::critical(this,"错误","信息读取失败");
       return;
    }

    //打开成功后，将数据读取到map 里面
    //以城市名 作为 key 值，城市ID 作为 Value 值
    while(!file.atEnd())//按行读取
    {
        QByteArray data = file.readLine();
        //将QByteArray -> QString
        QString mes = data;

        //求子串
        //前一部分 是城市ID  中间由 tab('\t') 隔开，后面是城市名 ，再加上换行符
        //abcdefg  abc 就是abcdefg 的一个子串
        int ipos = mes.indexOf('\t');//找到 '\t' 的位置
        QString city_id = mes.mid(0,ipos);//mid 求子串 -> 从第0位开始的 ipos个字符
        QString city_name = mes.mid(ipos+1);//从 ipos+1 开始，后的所有字符
        //由于city_name 里面 包含了换行符，我们需要去掉
        city_name.replace("\r\n","");//将换行符 替换成空
        this->city_info.insert(city_name,city_id);//将信息存放到容器里
    }
}
//发送在线搜索请求
void weather_online::send_requests()
{
    QString url = "http://t.weather.sojson.com/api/weather/city/";

    url += this->city_info[ui->query->text()];
    this->online->get(QNetworkRequest(QUrl(url)));
    qDebug()<<"请求发送成功，发送的链接为" << url << this->city_info[ui->query->text()];
}
//处理请求信息
void weather_online::handle_msg(QNetworkReply *re)
{
    //第一步 看状态码，200才能成功
    int statu = re->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();//获取状态码
    if(statu != 200)
    {
        QMessageBox::critical(this,"网络错误","请检查网络是否连接");
        return;
    }

    //如果为200 就需要正常处理信息 -> QJson
    QByteArray data = re->readAll();//读取网址上的信息
    QJsonDocument doc = QJsonDocument::fromJson(data);
    if(doc.isObject())
    {
        //获取到正确的数据
        QJsonObject obj = doc.object();
        //数据分析
        //将数据 放入到文本编辑框
        ui->weather_info->clear();
//        ui->weather_info->setText(doc.toJson());

        //数据解析
        QJsonObject cityinfo_obj = obj["cityInfo"].toObject();
        qDebug()<<"城市为" << cityinfo_obj["city"];

        if(obj.find("data") != obj.end())
        {
            //代表找到了data
            QJsonObject data_obj = obj["data"].toObject();
            if(data_obj.find( "forecast") != data_obj.end())
            {
                QJsonArray arry = data_obj["forecast"].toArray();
                //存储近七天信息
                QStringList strl ;
                for (int i = 0;i < 7; i++) {
                    QJsonObject obj_mes = arry[i].toObject();
                    QString day = obj_mes["ymd"].toString();
                    day += " " + obj_mes["week"].toString();
                    day += " " + obj_mes["type"].toString();
                    day += " " + obj_mes["high"].toString();
                    day += " " + obj_mes["low"].toString();
                    strl.append(day);
                    qs.append(obj_mes["notice"].toString());
                }
                //将七天信息显示
                for (int i = 0; i < 7 ; i++) {
                    ui->weather_info->addItem(strl[i]);
                }
                //自动显示当天信息
                ui->weather_info->setCurrentRow(0);
                if(ui->weather_info->currentRow()==0)
                    show_current();
//                ui->show_city->setText(strl[0]);
//                ui->notice->setText(qs[0]);

            }
        }
    }
    else
    {
        QMessageBox::critical(this,"错误","获取不到信息");
        return;
    }
}
//显示当前选中信息
void weather_online::show_current()
{
       ui->show_city->setText(ui->weather_info->currentItem()->text());
       QString str = ui->weather_info->currentItem()->text() ;

       //输出天气提示信息
       int index = ui->weather_info->currentRow();
       ui->notice->setText(qs.at(index));
       QMovie *movi = nullptr;
       // 在标签里面放动态图
       if(str.contains("雨"))
       {
           movi = new QMovie(":/pic/图片/2.gif");
       }
       else if (str.contains("云")) {
           movi = new QMovie(":/pic/图片/5.gif");
       }
       else if (str.contains("晴")) {
           movi = new QMovie(":/pic/图片/8.gif");
       }
       else  {
           movi = new QMovie(":/pic/图片/1.gif");
       }
       ui->label_2->setMovie(movi);//设置动态图  一帧一帧的动
       //如果不启动 将无法播放
       movi->start();
       ui->label_2->setScaledContents(true);//内容自动缩放
}
